﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using WebChart;
using System.Drawing;
using BussinessLogicTecnoPez.Produccion.Clasificacion_e_Incubacion;
using BussinessLogicTecnoPez.Produccion.Compras;
using BussinessLogicTecnoPez.Tipos_Comunes;
using BussinessLogicTecnoPez;
using System.Collections.Generic;
using Tecnopez.Globals;
using System.Transactions;
using System.Diagnostics;

public partial class Modules_ClasificacionIncubacion_RegistrarCrecimientoOvas : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/kchart.png";
        master.Titulo = "Registrar crecimiento de lote de ovas.";

        if (!IsPostBack )
        {
            mvwPrincipal.SetActiveView(viewSeleccionDeLote);
            dtFecha.Text = DateTime.Now.ToShortDateString();
        }
        InicializarGrillaDeCrecimiento();
        InicializarGrillaDeLotes();


    }

    private void InicializarGrillaDeCrecimiento()
    {
        DataControlField[] extraButtons = new DataControlField[1];
        ButtonField colB = new ButtonField();
        colB.ButtonType = ButtonType.Image;
        colB.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/eliminar.gif";
        colB.HeaderText = "Quitar";
        colB.CommandName = "Quitar";
        colB.HeaderStyle.Width = 5;
        colB.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
        extraButtons[0] = colB;
        grdCrecimiento.setupGrid(typeof(CrecimientoLoteOvas), cargarGrillaDeCrecimiento, true, false, ViewState, extraButtons);

    }

    private void cargarGrillaDeCrecimiento()
    {
     
        LoteOva objLoteDeOva = Session["loteDeOva"] as LoteOva;
        if (objLoteDeOva == null) return;
        CrecimientoLoteOvas.getManager.ClearFilters();
        CrecimientoLoteOvas.getManager.ClearOrders();
        CrecimientoLoteOvas.getManager.AddFilter("LoteDeOva", GenericManager<CrecimientoLoteOvas>.filterOperator.Equals, objLoteDeOva.IdLoteOva);
        CrecimientoLoteOvas.getManager.AddOrder("fecha", GenericManager<CrecimientoLoteOvas>.Order.orderDirection.ASC);
        List<CrecimientoLoteOvas> resultado = CrecimientoLoteOvas.getManager.GetFilter();
        grdCrecimiento.DataSource = resultado;
        grdCrecimiento.DataBind();
        CreateChart(resultado, objLoteDeOva);
    }

    private void cargarGrillaLoteDeOvas()
    {
        TipoEstadoLoteOvas estadoPendiente;
        TipoEstadoLoteOvas.getManager.ClearFilters();
        TipoEstadoLoteOvas.getManager.AddFilter("IdTipoEstadoLoteOva",
                    GenericManager<TipoEstadoLoteOvas>.filterOperator.Equals,
                    (int)TipoEstadoLoteOvas.estadosLoteOva.Incubando);
        estadoPendiente = TipoEstadoLoteOvas.getManager.GetOne();
        LoteOva.getManager.ClearFilters();
        LoteOva.getManager.ClearOrders();
        LoteOva.getManager.AddFilter("TipoEstadoLoteOva", GenericManager<LoteOva>.filterOperator.Equals, estadoPendiente.IdTipoEstadoLoteOva);

        if (grdLoteOvas.getPageDataViewOrderKeyValue(ViewState) == null)
        {
            LoteOva.getManager.AddOrder("IdLoteOva", GenericManager<LoteOva>.Order.orderDirection.DESC);
        }
        else
        {

            if (grdLoteOvas.getPageDataViewOrderKeyValue(ViewState) == "FechaString")
            {
                LoteOva.getManager.AddOrder("FechaIngreso", grdLoteOvas.getPageDataViewOrdenDireccionKeyValue<LoteOva>(ViewState));
            }
            else
            {
                LoteOva.getManager.AddOrder(grdLoteOvas.getPageDataViewOrderKeyValue(ViewState), grdLoteOvas.getPageDataViewOrdenDireccionKeyValue<LoteOva>(ViewState));
            }
        }
        List<LoteOva> lista = new List<LoteOva>();
        lista = LoteOva.getManager.GetFilter();
        grdLoteOvas.DataSource = lista;
        grdLoteOvas.DataBind();
    }

    private void InicializarGrillaDeLotes()
    {
        DataControlField[] extraButtons = new DataControlField[1];
        ButtonField colB = new ButtonField();
        colB.ButtonType = ButtonType.Image;
        colB.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/lupa.png";
        colB.HeaderText = "Seleccionar";
        colB.CommandName = "Seleccionar";
        colB.HeaderStyle.Width = 5;
        colB.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
        extraButtons[0] = colB;
        grdLoteOvas.setupGrid(typeof(LoteOva), cargarGrillaLoteDeOvas, true, true, ViewState, extraButtons);

    }

    private void ConfigureColors(ChartControl ChartControlToSetup)
    {
        ChartControlToSetup.Background.Color = Color.FromArgb(75, Color.SteelBlue);
        ChartControlToSetup.Background.Type = InteriorType.LinearGradient;
        ChartControlToSetup.Background.ForeColor = Color.SteelBlue;
        ChartControlToSetup.Background.EndPoint = new Point(500, 350);
        ChartControlToSetup.Legend.Position = LegendPosition.Bottom;
        ChartControlToSetup.Legend.Width = 40;

        ChartControlToSetup.YAxisFont.ForeColor = Color.SteelBlue;
        ChartControlToSetup.XAxisFont.ForeColor = Color.SteelBlue;

        ChartControlToSetup.ChartTitle.ForeColor = Color.White;

        ChartControlToSetup.Border.Color = Color.SteelBlue;
        ChartControlToSetup.BorderStyle = BorderStyle.Ridge;

    }

    protected void grdLoteOvas_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        try
        {
            int o = int.Parse(e.CommandArgument.ToString());
            o = Convert.ToInt32(grdLoteOvas.DataKeys[o].Value);
            seleccionarLoteDeOva(o);
        }
        catch
        {


        }
    }

    private void seleccionarLoteDeOva(Int32 o)
    {

        LoteOva objLoteOva = LoteOva.getManager.GetOneByPrimaryKey(o);
        if (objLoteOva != null)
        {
            mvwPrincipal.SetActiveView(viewRegistroDeCrecimiento);
            lblCodigoLote.Text = objLoteOva.Codigo;
            lblCantLoteOvas.Text = objLoteOva.Cantidad.ToString();
            lblEspecie.Text = objLoteOva.Especie.nombre;
            lblProveedorLote.Text = objLoteOva.Proveedor.RazonSocial;
            Session["loteDeOva"] = objLoteOva;
            InicializarGrillaDeCrecimiento();
            lblMensajeRegistrarCrecimiento.Text = "";
        }
        else
        {
            lblMensajeSeleccionDeLote.Text = "No se pudo seleccionar el lote de ova";
        }


    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Redirect("RegistrarCrecimientoOvas.aspx");
    }

    protected void grdLoteOvas_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
    protected void Registrar_Click(object sender, EventArgs e)
    {
        try
        {
            DateTime fecha;
            decimal tamanio;
            decimal peso;
            decimal ultimoValorTamanio = (decimal)ViewState["ultimoValorTamanio"];
            decimal ultimoValorPeso = (decimal)ViewState["ultimoValorPeso"];
            if (!decimal.TryParse(txtTamaño.Text, out tamanio) || tamanio <= 0)
            {
                lblMensajeRegistrarCrecimiento.Text = "El tamaño no es un valor válido.";
            }
            else if (!decimal.TryParse(txtPeso.Text, out peso) || peso <= 0)
            {
                lblMensajeRegistrarCrecimiento.Text = "El peso no es un valor válido.";
            }
            else if (!DateTime.TryParse(dtFecha.Text, out fecha))
            {
                lblMensajeRegistrarCrecimiento.Text = "La fecha no es válida.";
            }
            else if (ultimoValorPeso > 0 && peso < ultimoValorPeso)
            {
                lblMensajeRegistrarCrecimiento.Text = "El peso ingresado es menor al último registrado, por favor verifique ese dato.";
            }
            else if (ultimoValorTamanio > 0 && tamanio < ultimoValorTamanio)
            {
                lblMensajeRegistrarCrecimiento.Text = "El tamaño ingresado es menor al último registrado, por favor verifique ese dato.";
            }
            else
            {
                using (TransactionScope transaccion = new TransactionScope())
                {
                    LoteOva objLoteOva = Session["loteDeOva"] as LoteOva;

                    if (objLoteOva == null)
                    {
                        lblMensajeRegistrarCrecimiento.Text = "Se ha perdido al informacion de sesion por favor vuelva a cargar la pagina.";
                    }
                    else
                    {
                        CrecimientoLoteOvas objCrecimiento = new CrecimientoLoteOvas();
                        objCrecimiento.LoteDeOva = objLoteOva;
                        objCrecimiento.Fecha =fecha;
                        objCrecimiento.Tamanio = tamanio;
                        objCrecimiento.Peso = peso;
                        if (CrecimientoLoteOvas.getManager.Insert(objCrecimiento))
                        {
                            lblMensajeRegistrarCrecimiento.Text = "";
                            txtPeso.Text = "";
                            txtTamaño.Text = "";
                            dtFecha.Text = DateTime.Now.ToShortDateString();
                            objCrecimiento.actualizarUltimaClasificacion();
                            transaccion.Complete();
                        }
                        else
                        {
                            lblMensajeRegistrarCrecimiento.Text = "No se pudo registrar el crecimiento, ha sucedio un error.";
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            lblMensajeRegistrarCrecimiento.Text = "Error inseperado: " + ex.ToString();
        }
        finally
        {
            InicializarGrillaDeCrecimiento();
        }
    }
    protected void grdCrecimiento_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        try
        {
            int o = int.Parse(e.CommandArgument.ToString());
            o = Convert.ToInt32(grdCrecimiento.DataKeys[o].Value);
            Session["idCrecimientoLoteOvas"] = o;
            pnlConfirmaBorrar.Visible = true;
            InicializarGrillaDeCrecimiento();

            Debug.WriteLine(e.CommandName);
        }
        catch
        {


        }
    }
    protected void Button1_Click1(object sender, EventArgs e)
    {
        pnlConfirmaBorrar.Visible = false;
        Session.Remove("idCrecimientoLoteOvas");
        InicializarGrillaDeCrecimiento();
    }
    protected void btnDaBajaRegistro_Click(object sender, EventArgs e)
    {
        Int32 o = (Int32)Session["idCrecimientoLoteOvas"];
        CrecimientoLoteOvas c = new CrecimientoLoteOvas();
        using (TransactionScope transaccion = new TransactionScope())
        {
            c = CrecimientoLoteOvas.getManager.GetOneByPrimaryKey(o);
            if (c != null)
            {
                if (CrecimientoLoteOvas.getManager.Delete(c) > 0)
                {
                    InicializarGrillaDeCrecimiento();

                    transaccion.Complete();
                    Session.Remove("idCrecimientoLoteOvas");
                    pnlConfirmaBorrar.Visible = false;
                }
                else
                {
                    lblMensajeRegistrarCrecimiento.Text = "No se pudo completar la operación.";
                }
            }
            else
            {
                lblMensajeHistoricoCrecimiento.Text = "No se pudo realizar la operación solicitada, intente nuevamente mas adelante."; ;
            }
        }

    }
    private void CreateChart(List<CrecimientoLoteOvas> datos, LoteOva objLoteOva)
    {
        WebChart.LineChart chart1 = new LineChart();
        chart1.Line.Color = Color.Red;
        chart1.Fill.Color = Color.Red;
        chart1.LineMarker = new DiamondLineMarker(8, Color.Green, Color.Yellow);
        chart1.Legend = "Tamaño";
        LineChart chart5 = new LineChart();
        chart5.Line.Color = Color.Green;
        chart5.Fill.Color = Color.Green;
        chart5.LineMarker = new DiamondLineMarker(8, Color.Green, Color.Yellow);
        chart5.Legend = "Tamaño de clasificación";


        decimal limiteMinimo;
        decimal limiteMinimo2;



        limiteMinimo = objLoteOva.Especie.tamanominimo;
        limiteMinimo2 = objLoteOva.Especie.pesominimo;
        decimal ultimoValorTamanio = 0;
        decimal ultimoValorPeso = 0;


        foreach (CrecimientoLoteOvas crec in datos)
        {
            chart1.Data.Add(new ChartPoint(crec.Fecha.ToShortDateString(), (float)crec.Tamanio));
            chart5.Data.Add(new ChartPoint(crec.Fecha.ToShortDateString(), (float)limiteMinimo));
            ultimoValorTamanio = crec.Tamanio;
        }


        ChartControl1.Charts.Clear();
        ChartControl1.Charts.Add(chart1);
        ChartControl1.Charts.Add(chart5);
        ConfigureColors(ChartControl1);

        ChartControl1.RedrawChart();

        //segundo
        WebChart.LineChart chart12 = new LineChart();
        chart12.Line.Color = Color.Red;
        chart12.Fill.Color = Color.Red;
        chart12.LineMarker = new DiamondLineMarker(8, Color.Green, Color.Yellow);
        chart12.Legend = "Peso";
        LineChart chart52 = new LineChart();
        chart52.Line.Color = Color.Green;
        chart52.Fill.Color = Color.Green;
        chart52.LineMarker = new DiamondLineMarker(8, Color.Green, Color.Yellow);
        chart52.Legend = "Peso de clasificación";


        foreach (CrecimientoLoteOvas crec in datos)
        {
            chart12.Data.Add(new ChartPoint(crec.Fecha.ToShortDateString(), (float)crec.Peso));
            chart52.Data.Add(new ChartPoint(crec.Fecha.ToShortDateString(), (float)limiteMinimo2));
            ultimoValorPeso = crec.Peso;
        }

        ChartControl2.Charts.Clear();
        ChartControl2.Charts.Add(chart12);
        ChartControl2.Charts.Add(chart52);
        ConfigureColors(ChartControl2);

        ChartControl2.RedrawChart();
        lblSugerencia.Text = "No hay sugerencias en este momento.";
        if (ultimoValorTamanio >= limiteMinimo & ultimoValorPeso >= limiteMinimo2)
        {
            lblSugerencia.Text = "ya es tiempo de llevar este lote a un estanque de crianza ya que han superado el tamaño y peso minimo.";
        }
        else if (ultimoValorPeso >= limiteMinimo2)
        {
            lblSugerencia.Text = "ya es tiempo de llevar este lote a un estanque de crianza ya que han superado el peso minimo.";
        }
        else if (ultimoValorTamanio >= limiteMinimo)
        {
            lblSugerencia.Text = "ya es tiempo de llevar este lote a un estanque de crianza ya que han superado el tamaño minimo.";
        }



        ViewState["ultimoValorTamanio"] = ultimoValorTamanio;
        ViewState["ultimoValorPeso"] = ultimoValorPeso;


    }

}
